/*
 * Compresor.cpp
 *
 *  Created on: 21/06/2010
 *      Author: ignacio
 */

#include "Compresor.h"
#include <iostream>

const int Compresor::aritmetico[34] = {0,97,0,0,98,0,0,0,114,0,0,3,0,0,0,99,0,0,4,0,0,0,100,0,0,5,0,3,1,1,0,0,0,257};

Compresor* Compresor::instancia = NULL;

void Compresor::comprimir(char caracter,unsigned long int frecuenciaCaracter, unsigned long int frecuenciaTotal, unsigned long int frecuenciaAcumulada)
{
	if (!instancia){

		instancia = new Compresor("w+");

	}

	// TODO llamar al comprimir de Aritmetico
	instancia->agregarCaracterArchivo(frecuenciaAcumulada);
	std::cout << " Caracter a emitir: \"" << caracter << "\" frecuenciaCaracter: \"" << frecuenciaCaracter << "\" frecuencia Total \""<< frecuenciaTotal << "\" frecuencia Acumulada \"" << frecuenciaAcumulada <<"\"\n\n";
}

void Compresor::agregarCaracterArchivo(unsigned long int frecuenciaAcumulada){

	fwrite ((void*)&frecuenciaAcumulada,sizeof(unsigned long int),1,this->archivoComprimido);
}

int Compresor::descomprimir()
{
	if (!instancia){

		instancia = new Compresor("r+");

	}

	return instancia->obtenerCaracterDescomprimido();
}

Compresor::Compresor(char* modo){

	this->indice = 0;

	this->archivoComprimido = fopen("archivoComprimidoTemporal",modo);

}

Compresor::~Compresor(){

	fclose(this->archivoComprimido);


}

int Compresor::obtenerCaracterDescomprimido(){

//	this->indice++;

	unsigned long int frecuenciaActual;

	fread((void*)&frecuenciaActual,sizeof(unsigned long int),1,this->archivoComprimido);

//	return this->aritmetico[this->indice-1];

	return frecuenciaActual;

}

void Compresor::destruirCompresor(){

	delete instancia;

	instancia =NULL;
}
